package org.tangjl.multidatasource.dao;

import jakarta.annotation.Resource;
import jakarta.persistence.EntityManager;
import jakarta.transaction.Transactional;
import org.springframework.stereotype.Repository;
import org.tangjl.multidatasource.dynamic.DataSource;
import org.tangjl.multidatasource.dynamic.DataSourceType;
import org.tangjl.multidatasource.dynamic.DynamicDataSourceContextHolder;
import org.tangjl.multidatasource.model.User;


@Repository
public class UserDao {
    @Resource
    private EntityManager entityManager;

    /**
     * 保存默认库
     *
     * @param u 对象
     * @return 返回保存后的对象
     */
    @Transactional
    public User save(User u) {
        entityManager.persist(u);
        return u;
    }

    /**
     * 保存主库
     *
     * @param u 对象
     * @return 返回保存后的对象
     */
    @Transactional
    @DataSource(DataSourceType.PRIMARY)
    public User savePrimary(User u) {
        entityManager.persist(u);
        return u;
    }

    /**
     * 保存从库
     *
     * @param u 对象
     * @return 返回保存后的对象
     */
    @Transactional
    @DataSource(DataSourceType.SECONDARY)
    public User saveSecondary(User u) {
        entityManager.persist(u);
        return u;
    }

    /**
     * 同一个事务测试事物回滚
     * <p>
     * JPA 的事务中是不能切换数据源的，所以这里切换数据源是无效的，所以此测试没有意义，在非 JPA 的情况下是可以达到目的的
     *
     * @param u     对象
     * @param isExe 是否产生异常
     */
    @Deprecated
    @Transactional
    public void saveException(User u, boolean isExe) {
        DynamicDataSourceContextHolder.set(DataSourceType.SECONDARY);
        save(u);

        DynamicDataSourceContextHolder.set(DataSourceType.PRIMARY);
        save(new User().setName(u.getName()));
        if (isExe) {
            System.out.println("事物回滚了");
            throw new RuntimeException();
        }
    }
}
